#include <stdio.h>
#include <stdlib.h>
#include "heap.h"
#include "tcpprior.h"
#include "colap.h"

struct sColap
{
	Heap elems;
	int tamActual;
};

Colap
colap_create(const tcppos max)
{
	Colap c;
	
	c = (Colap) malloc (sizeof(struct sColap));
	if (c!=NULL)
	{
		c->elems = heap_create(max);
		c->tamActual = 0;
	}
	else
	{
		perror("No hay memoria para una nueva cola (colap_create)");
		exit(EXIT_FAILURE);
	}
return c;
}

void
colap_encolar(Colap c, const tcpalpha elem)
{
	if(colap_llena(c))
		printf("Warn: Cola llena, no hay más lugar (colap_encolar)\n");
	else
	{
		c->elems = heap_insert(c->elems, elem);
		c->tamActual += 1;
	}
}

tcpalpha
colap_primero(const Colap c)
{
	tcpalpha ret;
	if(colap_vacia(c))
	{
		perror("No se puede obtener el primero de una cola vacia (colap_primero)\n");
		exit(EXIT_FAILURE);
	}
	else
		ret = heap_primero(c->elems);
return ret;
}

void
colap_pop(Colap c)
{
	if(!(colap_vacia(c)))
	{
		c->elems = heap_pop(c->elems);
		c->tamActual -= 1;
	}
	else
		printf("Warn: Intentando sacar el primer elemento de una cola vacia; la cola sigue vacia\n");
}

Bool
colap_vacia(const Colap c)
{
	Bool b;
	b = heap_vacio(c->elems);
return b;
} 

Bool
colap_llena(const Colap c)
{
	Bool b;
	b = heap_lleno(c->elems);
return b;
}

tcpalpha
colap_saca(Colap c)
{
	tcpalpha ret;

	if(colap_vacia(c))
	{
		perror("No se puede obtener un elemento de una cola vacia (colap_saca)");
		exit(EXIT_FAILURE);
	}
	else
	{
		ret = heap_saca(c->elems);
		c->tamActual -= 1;
	}
return ret;
}

Colap
colap_destroy(Colap c)
{
	if (c!=NULL)
	{
		c->elems = heap_destroy(c->elems);
		free(c);
		c = NULL;
	}
return c;
}
